import { Workbook } from 'exceljs';
import { saveAs } from 'file-saver';
import { message } from 'antd';
import deepClone from 'lodash/cloneDeep';

// 内部锁，防止重复导出
let isExporting = false;

/**
 * 导出数据为 Excel 文件（xlsx 格式）
 * @param e 导出的事件对象（来自 DataGrid 的 onExporting）
 * @param form 表单信息（包含表单名称和字段属性）
 */
const exportToExcel = async (e: any, form: any) => {
  if (isExporting) {
    message.error('正在导出数据，请稍后再试!');
    return;
  }

  isExporting = true; // 加锁，防止重复导出

  try {
    if (e.format === 'xlsx') {
      e.component.beginCustomLoading('正在导出数据...');

      const workbook = new Workbook();
      const worksheet = workbook.addWorksheet(form.name);

      // 获取可见列并过滤掉“操作”列
      const columns = e.component
        .getVisibleColumns()
        .filter((col: any) => col.name !== '操作');
      worksheet.columns = columns.map((column: any) => ({
        header: column.caption,
        key: column.dataField,
      }));

      // 获取数据源
      const result: any = await e.component.getDataSource().store().load();
      let data: any[] = Array.isArray(result)
        ? deepClone(result)
        : deepClone(result.data);

      // 获取分类型字段（用于处理层级显示）
      const categoricalList = form.attributes.filter((attr: any) =>
        attr.property
          ? attr.property.valueType === '分类型'
          : attr.valueType === '分类型',
      );

      // 仅导出选中行（如果选择了导出选中行）
      if (e.selectedRowsOnly) {
        const selectedRowKeys: string[] = e.component.getSelectedRowKeys();
        data = data.filter((item: any) => selectedRowKeys.includes(item.id));
      }

      // 数据处理：映射字段值
      data.forEach((item: any) => {
        for (const column of columns) {
          const categorical = categoricalList.find((i: any) => i.id === column.dataField);
          const valueMap = (column.lookup as any)?.valueMap;
          const items = (column.lookup as any)?.items;

          if (categorical) {
            // 分类型字段处理 xxx/xxx/xxx 格式
            if (valueMap && column.dataField) {
              item[column.dataField] = findTextWithParent(item[column.dataField], items);
            }
          } else {
            // 普通字段映射
            if (valueMap && column.dataField) {
              item[column.dataField] = valueMap[item[column.dataField]];
            }
          }
        }
        worksheet.addRow(item);
      });

      // 导出 Excel 文件
      const buffer = await workbook.xlsx.writeBuffer();
      saveAs(
        new Blob([buffer], { type: 'application/octet-stream' }),
        `${form.name}.xlsx`,
      );

      e.component.endCustomLoading();
    }
  } catch (error) {
    console.error('导出失败:', error);
    message.error('导出失败，请重试！');
  } finally {
    isExporting = false; // 解锁
  }
};

const findTextWithParent = (value: string, data: any[]) => {
  let currentItem = data.find((item) => item.value === value);
  let texts = [];
  // 开始从当前项开始收集 text
  while (currentItem) {
    texts.unshift(currentItem.text); // 将当前文本添加到开头
    // 找到父项
    currentItem = data.find((item) => item.id === currentItem.parentId);
  }
  return texts.join('/'); // 用 '/' 分隔返回的文本
};

export { exportToExcel };
